package Spiel.Objekte;

import Spiel.Werte.FPosition;
import Spiel.Werte.FWeg;
import Spiel.Werte.IDimension;
import Spiel.Werte.IPosition;

public class Objekt implements IObjekt {

	private String name;
	private IPosition position;
	private IDimension dimension;

	public Objekt(String name) {
		this.name = name;
	}

	@Override
	public String getName() {
		return name;
	}

	@Override
	public void setName(String name) {
		this.name = name;
	}

	@Override
	public IPosition getPosition() {
		return position;
	}

	@Override
	public void setPosition(IPosition position) {
		if (position == null) {
			System.out.print("Diese Position gibt es nicht!" + "\n");
			return;
		}
		this.position = position;
	}

	@Override
	public double getX() {
		return position.getX();
	}

	@Override
	public double getY() {
		return position.getY();
	}

	@Override
	public double getZ() {
		return position.getZ();
	}

	@Override
	public IDimension getDimension() {
		return dimension;
	}

	@Override
	public void setDimension(IDimension dimension) {
		if (dimension == null) {
			System.out.print("Diese Dimension gibt es nicht!" + "\n");
			return;
		}
		this.dimension = dimension;
	}

	@Override
	public double getBreite() {
		return dimension.getBreite();
	}

	@Override
	public double getHoehe() {
		return dimension.getHoehe();
	}

	@Override
	public double getTiefe() {
		return dimension.getTiefe();
	}

	@Override
	public boolean isDrin(IPosition position) {
		boolean inX = false;
		boolean inY = false;
		boolean inZ = false;
		inX = (position.getX() >= this.position.getX())
				&& (position.getX() <= this.position.getX()
						+ this.dimension.getBreite());
		inY = (position.getY() >= this.position.getY())
				&& (position.getY() <= this.position.getY()
						+ this.dimension.getHoehe());
		inZ = (position.getZ() >= this.position.getZ())
				&& (position.getZ() <= this.position.getZ()
						+ this.dimension.getTiefe());
		return (inX && inY && inZ);
	}

	@Override
	public boolean isDrin(IObjekt objekt) {
		return (isDrin(objekt.getPosition())
				|| isDrin(FPosition.verschobenePosition(objekt.getPosition(),
						FWeg.weg(objekt.getBreite(), 0, 0)))
				|| isDrin(FPosition.verschobenePosition(objekt.getPosition(),
						FWeg.weg(0, objekt.getHoehe(), 0)))
				|| isDrin(FPosition.verschobenePosition(objekt.getPosition(),
						FWeg.weg(objekt.getBreite(), objekt.getHoehe(), 0)))
				|| isDrin(FPosition.verschobenePosition(objekt.getPosition(),
						FWeg.weg(0, 0, objekt.getTiefe())))
				|| isDrin(FPosition.verschobenePosition(objekt.getPosition(),
						FWeg.weg(objekt.getBreite(), 0, objekt.getTiefe())))
				|| isDrin(FPosition.verschobenePosition(objekt.getPosition(),
						FWeg.weg(0, objekt.getHoehe(), objekt.getTiefe()))) || isDrin(FPosition
					.verschobenePosition(objekt.getPosition(), FWeg.weg(
							objekt.getBreite(), objekt.getHoehe(),
							objekt.getTiefe()))));
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result
				+ ((position == null) ? 0 : position.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (getClass() != obj.getClass()) {
			return false;
		}
		Objekt other = (Objekt) obj;
		if (name == null) {
			if (other.name != null) {
				return false;
			}
		} else if (!name.equals(other.name)) {
			return false;
		}
		if (position == null) {
			if (other.position != null) {
				return false;
			}
		} else if (!position.equals(other.position)) {
			return false;
		}
		if (dimension == null) {
			if (other.dimension != null) {
				return false;
			}
		} else if (!dimension.equals(other.dimension)) {
			return false;
		}
		return true;
	}

	@Override
	public String toString() {
		return "Objekt [name=" + name + ", position=" + position
				+ ", dimension=" + dimension + "]";
	}
}
